package com.example.demo.security.otp.api;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

/**
 * 时钟类，用于获取当前时间的间隔。
 * 间隔是指从当前时间到最近一个整数间隔时间的秒数。
 * 例如，如果interval设置为30秒，则此类用于获取距离最近一个30秒整点的时间间隔。
 *
 * @author houp
 */
public class Clock {

    /**
     * 时间间隔，单位为秒，默认为30秒。<br>
     * 这个interval默认是30，当然你也可以改为1分钟那就是60.<br>
     * 另外这里先把毫秒转为秒，然后再除去interval，由于是使用/，因此是直接取整数部分，因而上面的DELAY_WINDOW的值=N，其实相当于允许过去的N个interval的code还能校验成功<br>
     * 默认值为30，在Clock里头可以通过构造器修改interval。不过由于Google Authenticator APP或阿里云的身份宝均为30秒更换一次，因此这个参数可以按默认的来。
     */
    private final int interval;
    /**
     * 用于计算时间的日历对象，使用UTC时区。
     */
    private Calendar calendar;

    /**
     * 默认构造函数，初始化interval为30秒。
     */
    public Clock() {
        interval = 30;
    }

    /**
     * 带参数的构造函数，允许自定义时间间隔。
     *
     * @param interval 时间间隔，单位为秒。
     */
    public Clock(int interval) {
        this.interval = interval;
    }

    /**
     * 获取当前时间间隔。
     * 当前时间间隔定义为从当前时间到最近一个整数间隔时间的秒数。
     *
     * @return 当前时间间隔，单位为整数秒。
     */
    public long getCurrentInterval() {
        // 初始化日历对象并设置为UTC时区
        calendar = GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC"));
        // 获取当前时间的毫秒数，并转换为秒
        long currentTimeSeconds = calendar.getTimeInMillis() / 1000;
        // 计算当前时间间隔，即当前时间秒数除以时间间隔
        return currentTimeSeconds / interval;
    }
}

